/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.usuario.servicio;

import com.nys.conci.base.ServicioBase;
import com.nys.conci.base.excepcion.ExcepcionServicio;
import com.nys.conci.citas.entidad.EstadoCita;
import com.nys.conci.cliente.entidad.*;
import com.nys.conci.usuario.entidad.Especialidad;
import com.nys.conci.usuario.entidad.EstadoUsuario;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

/**
 * Clase Servicio que se contiene la lógica del negocio relacionada con la
 * administracion. Contiene los métodos que acceden a la capa de persistencia, y
 * funciones con lógica del negocio.
 *
 * @author Yeudy10
 * @since 03/02/2013
 */
@Stateless
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
public class ServicioAdministracion extends ServicioBase {

    /**
     * Método que guarda o actualiza una especialidad
     *
     * @param esp Objeto de tipo Especialidad
     * @param modificar parámetro que indica si se va actualizar o guardar
     * @return El objeto que se guardo
     */
    public Especialidad guardarEspecialidad(Especialidad esp, boolean modificar) {
        try {
            if (modificar) {
                actualizar(esp);
            } else {
                guardar(esp);
            }
            return esp;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error al guardar la especialida",
                    "Ha ocurrido un error al guardar la especialida. En " + getClass() + ".guardarEspecialidad()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una lista de Especialidades
     *
     * @return Lista de especialidades
     */
    public List<Especialidad> consultarListaEspecialidades() {
        try {
            List<Especialidad> lista = new ArrayList<Especialidad>();
            String consulta = "SELECT a FROM Especialidad a ";
            lista = (List<Especialidad>) em.createQuery(consulta, Especialidad.class).getResultList();
            return lista;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de especialidades",
                    "Ha ocurrido un error obteniendo el listado de especialidades. En " + getClass() + ".consultarListaEspecialidades()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una lista de EstadoUsuario
     *
     * @return Lista de EstadoUsuario
     */
    public List<EstadoUsuario> consultarListaEstadoUsuarios() {
        try {
            List<EstadoUsuario> lista = new ArrayList<EstadoUsuario>();
            String consulta = "SELECT a FROM EstadoUsuario a ";
            lista = (List<EstadoUsuario>) em.createQuery(consulta, EstadoUsuario.class).getResultList();
            return lista;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de estados de usuario",
                    "Ha ocurrido un error obteniendo el listado de estados de usuario. En " + getClass() + ".consultarListaEstadoUsuarios()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una lista de EstadoCliente
     *
     * @return Lista de EstadoCliente
     */
    public List<EstadoCliente> consultarListaEstadoCliente() {
        try {
            List<EstadoCliente> lista = new ArrayList<EstadoCliente>();
            String consulta = "SELECT a FROM EstadoCliente a ";
            lista = (List<EstadoCliente>) em.createQuery(consulta, EstadoCliente.class).getResultList();
            return lista;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de estados de clientes",
                    "Ha ocurrido un error obteniendo el listado de estados de clientes. En " + getClass() + ".consultarListaEstadoCliente()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una lista de EstadoCita
     *
     * @return Lista de EstadoCita
     */
    public List<EstadoCita> consultarListaEstadoCita() {
        try {
            List<EstadoCita> lista = new ArrayList<EstadoCita>();
            String consulta = "SELECT a FROM EstadoCita a ";
            lista = (List<EstadoCita>) em.createQuery(consulta, EstadoCita.class).getResultList();
            return lista;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de estados de citas",
                    "Ha ocurrido un error obteniendo el listado de estados de citas. En " + getClass() + ".consultarListaEstadoCita()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una especialidad por medio del identificador
     *
     * @param id_especialidad id de la especialidad
     * @return Objeto de tipo Especialidad
     */
    public Especialidad consultarEspecialidad(int id_especialidad) {
        try {
            List<Especialidad> lista = new ArrayList<Especialidad>();
            String consulta = "SELECT a FROM Especialidad a where id_especialidad = :id_especialidad";
            lista = (List<Especialidad>) em.createQuery(consulta, Especialidad.class).setParameter("id_especialidad", id_especialidad).getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de especialidades",
                    "Ha ocurrido un error obteniendo el listado de especialidades. En " + getClass() + ".consultarListaEspecialidades()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta un plan cliente por medio del identificador y el id
     * del plan de pago
     *
     * @param id_plan_pago Id del plan de pago
     * @param identificacion_c identificacion del cliente
     * @return Null si existe de lo contrario el objeto encontrado
     */
    public PlanCliente consultarPlanCliente(Integer id_plan_pago, String identificacion_c) {
        try {
            List<PlanCliente> lista = new ArrayList<PlanCliente>();
            String consulta = "SELECT a FROM PlanCliente a where id_plan_pago = :id_plan_pago and identificacion_c = :identificacion_c";
            lista = (List<PlanCliente>) em.createQuery(consulta, PlanCliente.class).setParameter("id_plan_pago", id_plan_pago).setParameter("identificacion_c", identificacion_c).
                    getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo un plan de un cliente",
                    "Ha ocurrido un error obteniendo un plan de un cliente. En " + getClass()
                    + ".consultarPlanCliente(Integer id_plan_pago, String identificacion_c)",
                    ex, getClass());
        }
    }
    
    
    /**
     * Método que consulta un plan cliente por medio del identificador y el id
     * del plan de pago
     *
     * @param id_plan_cliente Id del plan de pago     
     * @return Null si existe de lo contrario el objeto encontrado
     */
    public PlanCliente consultarPlanPagoCliente(Integer id_plan_cliente) {
        try {
            List<PlanCliente> lista = new ArrayList<PlanCliente>();
            String consulta = "SELECT a FROM PlanCliente a where id_plan_cliente = :id_plan_cliente";
            lista = (List<PlanCliente>) em.createQuery(consulta, PlanCliente.class).setParameter("id_plan_cliente", id_plan_cliente).
                    getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo un plan de un cliente",
                    "Ha ocurrido un error obteniendo un plan de un cliente. En " + getClass()
                    + ".consultarPlanPagoCliente(Integer id_plan_cliente)",
                    ex, getClass());
        }
    }    
    
    /**
     * Método que consulta un plan cliente por medio del identificador y el id
     * del plan de pago
     *
     * @param id_plan_pago Id del plan de pago     
     * @return Null si existe de lo contrario el objeto encontrado
     */
    public PlanCliente consultarPlanClientePago(Integer id_plan_pago) {
        try {
            List<PlanCliente> lista = new ArrayList<PlanCliente>();
            String consulta = "SELECT a FROM PlanCliente a where id_plan_pago = :id_plan_pago";
            lista = (List<PlanCliente>) em.createQuery(consulta, PlanCliente.class).setParameter("id_plan_pago", id_plan_pago).
                    getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo un plan de un cliente",
                    "Ha ocurrido un error obteniendo un plan de un cliente. En " + getClass()
                    + ".consultarPlanClientePago(Integer id_plan_pago)",
                    ex, getClass());
        }
    }       

    /**
     * Método que consulta un plan de pago por medio del identificador
     *
     * @param id_plan_pago id del plan de pago
     * @return Objeto de tipo PlanPago
     */
    public PlanPago consultarPlanPago(int id_plan_pago) {
        try {
            List<PlanPago> lista = new ArrayList<PlanPago>();
            String consulta = "SELECT a FROM PlanPago a where id_plan_pago = :id_plan_pago";
            lista = (List<PlanPago>) em.createQuery(consulta, PlanPago.class).setParameter("id_plan_pago", id_plan_pago).getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de planes de pago",
                    "Ha ocurrido un error obteniendo el listado de planes de pago. En " + getClass() + ".consultarPlanPago(int id_plan_pago)",
                    ex, getClass());
        }
    }
    
    
    /**
     * Método que consulta un plan de pago por medio del identificador de la especialidad
     *
     * @param id_especialidad id de la especialidad
     * @return Objeto de tipo PlanPago
     */
    public PlanPago consultarPlanPagoEspe(int id_especialidad) {
        try {
            List<PlanPago> lista = new ArrayList<PlanPago>();
            String consulta = "SELECT a FROM PlanPago a where id_especialidad = :id_especialidad";
            lista = (List<PlanPago>) em.createQuery(consulta, PlanPago.class).setParameter("id_especialidad", id_especialidad).getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de planes de pago",
                    "Ha ocurrido un error obteniendo el listado de planes de pago. En " + getClass() + ".consultarPlanPagoEspe(int id_especialidad)",
                    ex, getClass());
        }
    }    

    /**
     * Método que consulta un Pago por medio del id de la cita
     *
     * @param id_cita id de la cita que se pago
     * @return Objeto de tipo Pago
     */
    public Pago consultarPagoCitaId(int id_cita) {
        try {
            List<Pago> lista = new ArrayList<Pago>();
            String consulta = "SELECT a FROM Pago a where id_cita = :id_cita";
            lista = (List<Pago>) em.createQuery(consulta, Pago.class).setParameter("id_cita", id_cita).getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo un pago de una cita",
                    "Ha ocurrido un error obteniendo un pago de una cita. En " + getClass() + ".consultarPagoCitaId(int id_cita)",
                    ex, getClass());
        }
    }
    
    /**
     * Método que consulta un Pago por medio del id de la  especialidad
     *
     * @param id_especialidad id de la especialidad
     * @return Objeto de tipo Pago
     */
    public Pago consultarPagoCitaIdEspe(int id_especialidad) {
        try {
            List<Pago> lista = new ArrayList<Pago>();
            String consulta = "SELECT a FROM Pago a where id_especialidad = :id_especialidad";
            lista = (List<Pago>) em.createQuery(consulta, Pago.class).setParameter("id_especialidad", id_especialidad).getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo un pago de una cita",
                    "Ha ocurrido un error obteniendo un pago de una cita. En " + getClass() + ".consultarPagoCitaIdEspe(int id_especialidad)",
                    ex, getClass());
        }
    }    

    /**
     * Método que consulta un plan de pago por medio del identificador
     *
     * @param id_estado_cita id del plan de pago
     * @return Objeto de tipo PlanPago
     */
    public EstadoCita consultarEstadoCita(int id_estado_cita) {
        try {
            List<EstadoCita> lista = new ArrayList<EstadoCita>();
            String consulta = "SELECT a FROM EstadoCita a where id_estado_cita = :id_estado_cita";
            lista = (List<EstadoCita>) em.createQuery(consulta, EstadoCita.class).setParameter("id_estado_cita", id_estado_cita).getResultList();
            if (lista == null || lista.isEmpty()) {
                return null;
            } else {
                return lista.get(0);
            }
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de estados de citas",
                    "Ha ocurrido un error obteniendo el listado de estados de citas. En " + getClass() + ".consultarEstadoCita(int id_estado_cita)",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una lista de planes de pago
     *
     * @return Lista de planes de pago
     */
    public List<PlanPago> consultarListaPlanesPago() {
        try {
            List<PlanPago> lista = new ArrayList<PlanPago>();
            String consulta = "SELECT s FROM PlanPago s ";
            lista = em.createQuery(consulta, PlanPago.class).getResultList();
            return lista;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de planes de pago",
                    "Ha ocurrido un error obteniendo el listado de planes de pago. En " + getClass() + ".consultarListaPlanesPago()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una lista de planes de pago
     *
     * @return Lista de planes de Clientes de un cliente
     */
    public List<PlanCliente> consultarListaPlanesPagoCliente(String id) {
        try {
            List<PlanCliente> lista = new ArrayList<PlanCliente>();
            String consulta = "select pc.* from plan_pago p, cliente c, plan_cliente pc "
                    + "where "
                    + "c.identificacion = :id and "
                    + "c.identificacion = pc.identificacion_c and "
                    + "pc.id_plan_pago = p.id_plan_pago ";
            lista = em.createNativeQuery(consulta, PlanCliente.class).setParameter("id", id).getResultList();
            return lista;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de planes de pago",
                    "Ha ocurrido un error obteniendo el listado de planes de pago. En " + getClass() + ".consultarListaPlanesPago()",
                    ex, getClass());
        }
    }

    /**
     * Método que consulta una lista de duraciones
     *
     * @return Lista de duraciones
     */
    public List<Duracion> consultarListaDuracion() {
        try {
            List<Duracion> lista = new ArrayList<Duracion>();
            String consulta = "SELECT s FROM Duracion s ";
            lista = em.createQuery(consulta, Duracion.class).getResultList();
            return lista;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error obteniendo el listado de duraciones",
                    "Ha ocurrido un error obteniendo el listado de duraciones. En " + getClass() + ".consultarListaDuracion()",
                    ex, getClass());
        }
    }

    /**
     * Método que guarda o actualiza un plan de pago
     *
     * @param plan Plan que se va a guardar
     * @param modificar variable que indica si se va a modificar o guardar
     * @return Objeto que se guardo
     */
    public PlanPago guardarPlanpago(PlanPago plan, boolean modificar) {
        try {
            if (modificar) {
                actualizar(plan);
            } else {
                guardar(plan);
            }

            return plan;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error al guardar el plan de pago",
                    "Ha ocurrido un error al guardar el plan de pago. En " + getClass() + ".guardarPlanpago()",
                    ex, getClass());
        }
    }

    /**
     * Método que guarda o actualiza un plan cliente
     *
     * @param plan Plan que se va a guardar
     * @param modificar variable que indica si se va a modificar o guardar
     * @return Objeto que se guardo
     */
    public PlanCliente guardarPlanCliente(PlanCliente plan, boolean modificar) {
        try {
            if (modificar) {
                actualizar(plan);
            } else {
                guardar(plan);
            }

            return plan;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error al guardar el plan del cliente",
                    "Ha ocurrido un error al guardar el plan del cliente. En " + getClass() + ".guardarPlanCliente(PlanCliente plan, boolean modificar)",
                    ex, getClass());
        }
    }

    /**
     * Método que guarda o actualiza un estado de usuario
     *
     * @param estado EstadoUsuario que se va a guardar
     * @param modificar variable que indica si se va a modificar o guardar
     * @return Objeto que se guardo
     */
    public EstadoUsuario guardarEstadoUsuario(EstadoUsuario estado, boolean modificar) {
        try {
            if (modificar) {
                actualizar(estado);
            } else {
                guardar(estado);
            }

            return estado;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error al guardar el estado de usuario",
                    "Ha ocurrido un error al guardar el estado de usuario. En " + getClass() + ".guardarEstadoUsuario()",
                    ex, getClass());
        }
    }

    /**
     * Método que guarda o actualiza un estado de cliente
     *
     * @param estado EstadoCliente que se va a guardar
     * @param modificar variable que indica si se va a modificar o guardar
     * @return Objeto que se guardo
     */
    public EstadoCliente guardarEstadoCliente(EstadoCliente estado, boolean modificar) {
        try {
            if (modificar) {
                actualizar(estado);
            } else {
                guardar(estado);
            }

            return estado;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error al guardar el estado del cliente",
                    "Ha ocurrido un error al guardar el estado del cliente. En " + getClass() + ".guardarEstadoCliente()",
                    ex, getClass());
        }
    }

    /**
     * Método que guarda o actualiza un estado de citas
     *
     * @param estado EstadoCita que se va a guardar
     * @param modificar variable que indica si se va a modificar o guardar
     * @return Objeto que se guardo
     */
    public EstadoCita guardarEstadoCita(EstadoCita estado, boolean modificar) {
        try {
            if (modificar) {
                actualizar(estado);
            } else {
                guardar(estado);
            }

            return estado;
        } catch (Exception ex) {
            throw new ExcepcionServicio("Ha ocurrido un error al guardar el estado del cliente",
                    "Ha ocurrido un error al guardar el estado del cliente. En " + getClass() + ".guardarEstadoCita()",
                    ex, getClass());
        }
    }
}
